namespace SmartMathLibrary
{
    /// <summary>
    /// Interface to implement a Sphere class.
    /// </summary>
    public interface ISphere
    {
        /// <summary>
        /// Gets or sets the centre of the sphere.
        /// </summary>
        /// <value>The centre of the sphere.</value>
        Point3D Centre { get; set; }

        /// <summary>
        /// Gets or sets the radius of the sphere.
        /// </summary>
        /// <value>The radius of the sphere.</value>
        double Radius { get; set; }

        /// <summary>
        /// Compares the current instance of the sphere to another.
        /// </summary>
        /// <param name="compare">The sphere to compare.</param>
        /// <returns>True if the position and the radius are even to the specified compareshpere 
        /// otherwise, false</returns>
        bool CompareTo(Sphere compare);

        /// <summary>
        /// Scales the position elements x, y and z of the sphere with a specified factor.
        /// </summary>
        /// <param name="scaleFactor">The scale factor.</param>
        void ScaleTransformation(double scaleFactor);

        /// <summary>
        /// Scales the position elements x, y and z of the sphere with a specified factor.
        /// </summary>
        /// <param name="scaleFactorX">The scale factor for the x position.</param>
        /// <param name="scaleFactorY">The scale factor for the y position.</param>
        /// <param name="scaleFactorZ">The scale factor for the z position.</param>
        void ScaleTransformation(double scaleFactorX, double scaleFactorY, double scaleFactorZ);

        /// <summary>
        /// Translates the position of the sphere.
        /// </summary>
        /// <param name="translateValue">The translate value for x, y and zs position.</param>
        void TranslateTransformation(double translateValue);

        /// <summary>
        /// Translates the position of the sphere.
        /// </summary>
        /// <param name="translateValueX">The translate value for x position.</param>
        /// <param name="translateValueY">The translate value for y position.</param>
        /// <param name="translateValueZ">The translate value for z position.</param>
        void TranslateTransformation(double translateValueX, double translateValueY, double translateValueZ);
    }
}